import subprocess, tarfile, shutil, sys, os
from datetime import datetime

try:
    TEXT_LINE = 80 * '='
    
    if len( sys.argv ) < 2:
        raise Exception( 'Ожидается аргумент: местоположение tar.gz архива selenium!' ) 
    
    archive = sys.argv[1]
    
    if not os.path.exists( archive ):
        raise Exception( 'Файл "%s" не существует!' % archive )
    
    archive_path, archive_file = os.path.split( archive )
    if archive_file[-7:] != '.tar.gz':
        raise Exception( 'Расширение файла отличается от tar.gz' )
    archive_dir = archive_file[:-7]
    
    python_dir, python_exe = os.path.split( sys.executable )
    
    print( 'Разархивируем в текущий каталог файл "%s"...' % archive )
    
    tar = tarfile.open( archive )
    tar.extractall()
    tar.close()
    
    selsrc = os.path.join( archive_dir, 'py', 'selenium' )
    seldst = os.path.join( python_dir, 'Lib', 'selenium' )
    
    print( 'Копируем каталог "%s" в каталог "%s"...' % (selsrc, seldst) )
    
    if os.path.exists( seldst ):
        selbak = '{}_{:%Y_%m_%d_%H_%M_%S}'.format( seldst, datetime.now() )
        print( 'Сохраняем существующую библиотеку в каталог "%s"...' % selbak )
        shutil.move( seldst, selbak )
    shutil.copytree( selsrc, seldst )
    
    print( 'Преобразуем библиотеку selenium в модуль Python 3...' )
    
    conv_2to3 = os.path.join( python_dir, 'Tools', 'Scripts', '2to3.py' )
    print( TEXT_LINE ) 
    subprocess.call( [conv_2to3, '-w', seldst], shell=True )
    print( TEXT_LINE ) 
    
    remote_conn = os.path.join( seldst, 'webdriver', 'remote', 'remote_connection.py' )
    remote_orig = remote_conn + '.backup'
    shutil.copy( remote_conn, remote_orig )
    
    print( 'Корректируем файл "%s"...' % remote_conn )
    
    replace_dict = { r'request = Request(cleaned_url, data=data, method=method)':
                     r'request = Request(cleaned_url, data=data.encode(), method=method)', # строку с данными в байтовый массив
                     
                     r'request = Request(url, data=data, method=method)':
                     r'request = Request(url, data=data.encode(), method=method)', # строку с данными в байтовый массив
                     
                     r'urllib.request.HTTPBasicAuthHandler(password_manager))':
                     r'urllib.request.HTTPBasicAuthHandler(password_manager), urllib.request.ProxyHandler( {} ))', # убираем прокси
                     
                     r'HttpErrorHandler())':
                     r'HttpErrorHandler(), urllib.request.ProxyHandler( {} ))', # убираем прокси
                     
                     r"body = response.read().replace('\x00', '').strip()":
                     r"body = response.read().decode().replace('\x00', '').strip()", # байтовый массив в строку
                     
                     r"content_type = response.info().getheader('Content-Type') or []":
                     r"content_type = response.info()['Content-Type'] or []" } # заголовки HTTP теперь хэш-массив
    
    # заменяем соответствующие строки
    orig = open( remote_orig )
    upd = open( remote_conn, 'w' )
    print( TEXT_LINE ) 
    for line in orig:
        replaced = False
        for repl in replace_dict:
            if line.rfind( repl ) >= 0:
                print( '-%s\n+%s\n' % (repl, replace_dict[repl]) )
                upd.write( line.replace( repl, replace_dict[repl] ) )
                replaced = True
                break;
        if not replaced:
            upd.write( line )
    print( TEXT_LINE ) 
    upd.close()
    orig.close()
    
    print( 'Успешное завершение' )
except Exception as e:
    print( 'Ошибка: %s' % e )
